<!DOCTYPE html>
<meta charset="utf-8">
<title>Interface.prototype.constructor is defined on [[Set]] receiver</title>
<link rel="help" href="https://heycam.github.io/webidl/#interface-prototype-object">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";

test(() => {
  window.constructor = null;
  assert_equals(Window.prototype.constructor, Window);

  location.constructor = false;
  assert_equals(Location.prototype.constructor, Location);

  navigator.constructor = 1;
  assert_equals(Navigator.prototype.constructor, Navigator);

  document.constructor = {};
  assert_equals(HTMLDocument.prototype.constructor, HTMLDocument);

  document.head.constructor = [];
  assert_equals(HTMLHeadElement.prototype.constructor, HTMLHeadElement);
}, "Window, Location, Navigator, HTMLDocument, and HTMLHeadElement");

test(() => {
  for (let key of Object.getOwnPropertyNames(window)) {
    if (!/^[A-Z]/.test(key)) continue;

    let desc = Object.getOwnPropertyDescriptor(window, key);
    if (!desc || desc.enumerable) continue;
    let {value} = desc;
    if (typeof value !== "function") continue;
    let {prototype} = value;
    if (!prototype) continue;

    let heir = Object.create(prototype);
    let newConstructor = function() {};
    heir.constructor = newConstructor;

    assert_not_equals(prototype.constructor, newConstructor, key);
    assert_own_property(heir, "constructor", key);
    assert_equals(heir.constructor, newConstructor, key);
  }
}, "All window.* constructors");
</script>
